// 连接管理 -- 有 listenfd 和 普通 fd

#pragma once

#include <iostream>
#include <string>
#include "InetAddr.hpp"

// 封装fd，保证给每一个fd一套缓冲
class Reactor;

//加上业务 
using handler_t = std::function<std::string (std::string &)>;

// 这是一个基类 , listenfd 和 普通 fd 都继承它
class Connect
{
public:
    Connect()
        : _events(0), _owner(nullptr)
    {
    }
    ~Connect() {}

    Reactor *GetOwner()
    {
        return _owner;
    }

    virtual void Recver() = 0;
    virtual void Sender() = 0;
    virtual void Excepter() = 0;
    virtual int GetSockFd() = 0;

    void SetEvent(uint32_t envet)
    {
        _events = envet;
    }

    uint32_t GetEvents()
    {
        return _events;
    }

    void SetOwner(Reactor *owner)
    {
        _owner = owner;
    }

    // 设置为非阻塞
    void SetNoBlock(int sockfd)
    {
        int n = fcntl(sockfd, F_GETFL);
        if (n < 0)
            return;
        fcntl(sockfd, F_SETFL | O_NONBLOCK);
    }

    //注册上层任务 
    void RegisterHandler(handler_t handler)
    {
        _handler = handler;
    }

private:
    // 关心事件
    uint32_t _events;

    // 回指指针 -- 访问基座方法 , Reactor 反应堆模式
    Reactor *_owner;

public:
    // 基类中定义了一个回调函数
    handler_t _handler;
};